home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / programm / gemfsc20 / gemfsc20.lzh / GEMFUNCS / OBJTHERM.C < prev    next >
C/C++ Source or Header  |  1993-03-20  |  5KB  |  181 lines

  1. /**************************************************************************
  2.  *
  3.  *************************************************************************/
  4.  
  5. #include "gemfintl.h"
  6.  
  7. #define EXTEND_INTERIOR 0x8000
  8.  
  9. typedef struct {
  10.     XUSERBLK   xub;
  11.     short       tick_limit;
  12.     short       tick_count;
  13.     short       tick_width;
  14.     short       curr_width;
  15.     short       full_width;
  16.     short       fill_style;
  17.     short       xoffset;
  18. } ThermoInfo;
  19.  
  20. #ifdef GEMFAST_PROTOS
  21.   static long GCALLBACK draw_thermo(XPARMBLK *pb)
  22. #else
  23.   static long GCALLBACK draw_thermo(pb)
  24.     register XPARMBLK    *pb;
  25. #endif
  26. {
  27.     register ThermoInfo *pt = (ThermoInfo *)pb->pub;
  28.     register short         vdi_handle;
  29.     register short         fillwidth;
  30.     VRECT                 cliprect;
  31.     VRECT                 boxrect;
  32.     GRECT                 objrect;
  33.  
  34.     if (0 == (vdi_handle = apl_vshared())) {
  35.         return 0;
  36.     }
  37.  
  38.     fillwidth = pt->tick_count * pt->tick_width;
  39.     if (fillwidth > pt->full_width) {
  40.         fillwidth = pt->full_width;
  41.     }
  42.  
  43.     rc_copy(&pb->drawrect, &objrect);
  44.     objrect.g_x += pt->xoffset;
  45.     objrect.g_w  = pt->full_width;
  46.  
  47.     rc_gtov(&objrect, &boxrect);
  48.     rc_vadjust(&boxrect, 1, 1);
  49.  
  50.     if (pt->fill_style & EXTEND_INTERIOR) {
  51.         objrect.g_x += pt->curr_width - 1;
  52.         rc_intersect(&pb->cliprect, &objrect);
  53.         rc_gtov(&objrect, &cliprect);
  54.         vs_clip(vdi_handle, 1, (short *)&cliprect);
  55.     } else {
  56.         rc_gtov(&pb->cliprect, &cliprect);
  57.         vs_clip(vdi_handle, 1, (short *)&cliprect);
  58.         vsf_interior(vdi_handle, IS_HOLLOW);
  59.         v_bar(vdi_handle, (short *)&boxrect);
  60.     }
  61.  
  62.     boxrect.v_x2 = boxrect.v_x1 + fillwidth;
  63.  
  64.     vsf_interior(vdi_handle, IS_PATTERN);
  65.     vsf_style(vdi_handle, pt->fill_style & 0x0007);
  66.     v_bar(vdi_handle, (short *)&boxrect);
  67.     vsf_style(vdi_handle, IP_SOLID);
  68.     vsf_interior(vdi_handle, IS_SOLID);
  69.  
  70.     vs_clip(vdi_handle, 0, (short *)&cliprect);
  71.  
  72.     pt->curr_width = fillwidth;
  73.  
  74.     return 0;
  75.  
  76. }
  77.  
  78. short obj_mkthermo(ptree, object, nincr)
  79.     OBJECT            *ptree;
  80.     register short       object;
  81.     register short       nincr;
  82. {
  83.     register short            iwidth;
  84.     register OBJECT      *pobj = &ptree[object];
  85.     register ThermoInfo  *pt;
  86.  
  87. /*-------------------------------------------------------------------------
  88.  * Check for zero increments to prevent div-by-zero errors.
  89.  * Calc the pixel width of one increment.
  90.  * Make sure a VDI workstation is available for later.
  91.  *-----------------------------------------------------------------------*/
  92.  
  93.     if (0 >= nincr)
  94.         return gfErr_parameter_range;
  95.  
  96.     if (0 == (iwidth = pobj->ob_width / nincr))
  97.         return gfErr_parameter_range;
  98.  
  99.     if (0 == apl_vshared()) {
  100.         return gfErr_vdi_handle;
  101.     }
  102.  
  103. /*-------------------------------------------------------------------------
  104.  * If the object has already been made into a G_THERMO extended object,
  105.  * just get its pointer, else make it into such an object.
  106.  *-----------------------------------------------------------------------*/
  107.  
  108.     if ((pobj->ob_type & 0x00FF) == G_USERDEF) {
  109.         pt = (ThermoInfo *)pobj->_Ob_spec;
  110.         if (pt->xub.ob_type != G_THERMO) {
  111.             return gfErr_wrong_type;
  112.         }
  113.     } else {
  114.         if (NULL == (pt = apl_malloc((long)sizeof(*pt)))) {
  115.             return gfErr_no_memory;
  116.         }
  117.         obj_mxuserdef(ptree, object, &pt->xub, draw_thermo, NULL, (long)sizeof(*pt));
  118.         pt->xub.ob_type = G_THERMO;
  119.     }
  120.  
  121. /*-------------------------------------------------------------------------
  122.  *-----------------------------------------------------------------------*/
  123.  
  124.     pt->curr_width = 0;
  125.     pt->tick_limit = nincr;
  126.     pt->tick_count = 0;
  127.     pt->tick_width = iwidth;
  128.     pt->full_width = nincr * iwidth;
  129.     pt->xoffset    = (pobj->ob_width - pt->full_width) / 2;
  130.     pt->fill_style = (short)(((long)pt->xub.ob_spec >> 4) & 0x0007);
  131.  
  132.     return 0;
  133.  
  134. }
  135.  
  136. short obj_udthermo(ptree, object, newpos, pclip)
  137.     OBJECT *ptree;
  138.     short      object;
  139.     short      newpos;
  140.     GRECT  *pclip;
  141. {
  142.     register ThermoInfo *pt = (ThermoInfo *)ptree[object]._Ob_spec;
  143.     short                  oldpos;
  144.  
  145.     if ((ptree[object].ob_type & 0x00FF) != G_USERDEF
  146.      || pt->xub.ob_type != G_THERMO) {
  147.         return 0;
  148.     }
  149.  
  150.     oldpos = pt->tick_count;
  151.  
  152.     if (newpos == OBJ_TINQUIRE) {
  153.         return oldpos;
  154.     } else if (newpos < 0) {
  155.         newpos = pt->tick_count + 1;
  156.     }
  157.  
  158.     if (newpos > pt->tick_limit) {
  159.         newpos = pt->tick_limit;
  160.     }
  161.  
  162.     if (oldpos == newpos) {
  163.         return oldpos;
  164.     }
  165.  
  166.     pt->tick_count = newpos;
  167.  
  168.     if (pclip != NULL) {
  169.         if (oldpos < newpos) {
  170.             pt->fill_style |= EXTEND_INTERIOR;
  171.         }
  172.         objc_draw(ptree, object, MAX_DEPTH, RECTVALS(pclip));
  173.         pt->fill_style &= ~EXTEND_INTERIOR;
  174.     }
  175.  
  176.     return oldpos;
  177. }
  178.  
  179.  
  180.  
  181.